home *** CD-ROM | disk | FTP | other *** search
/ Ham Radio 2000 / Ham Radio 2000.iso / ham2000 / misc / dspice0s / mosq2.c < prev    next >
C/C++ Source or Header  |  1992-11-21  |  8KB  |  234 lines

  1. /* mosq2.f -- translated by f2c (version of 3 February 1990  3:36:42).
  2.    You must link the resulting object file with the libraries:
  3.     -lF77 -lI77 -lm -lc   (in that order)
  4. */
  5.  
  6. #include "f2c.h"
  7.  
  8. /*<       subroutine mosq2(vds,vbs,vgs,vdsat,vth,vbin,gamasd,cox,phi, >*/
  9. /*<      1   qg,qc,qb,cggb,cgdb,cgsb,cbgb,cbdb,cbsb) >*/
  10. /* Subroutine */ int mosq2_(vds, vbs, vgs, vdsat, vth, vbin, gamasd, cox, phi,
  11.      qg, qc, qb, cggb, cgdb, cgsb, cbgb, cbdb, cbsb)
  12. doublereal *vds, *vbs, *vgs, *vdsat, *vth, *vbin, *gamasd, *cox, *phi, *qg, *
  13.     qc, *qb, *cggb, *cgdb, *cgsb, *cbgb, *cbdb, *cbsb;
  14. {
  15.     /* System generated locals */
  16.     doublereal d_1;
  17.  
  18.     /* Builtin functions */
  19.     double sqrt();
  20.  
  21.     /* Local variables */
  22.     static doublereal argd, argn, ve1p5, ve2p5, vsat, vs1p5, vs2p5, argd2, 
  23.         term0, term1, term2, term3, term4, term5, term6, term7, dddve, 
  24.         dddvs, term10, term11, term12, term20, term21, term22, sqarg, 
  25.         gamma2, vd, ve, vg, dgndve, vs, dqgdve, dvedvd, dvedvg, dgndvs, 
  26.         ve2, ve3, ve5, vs2, vs3, vs5, vbd, vgb, vep5, vsp5;
  27.  
  28. /*<       implicit double precision (a-h,o-z) >*/
  29.  
  30. /*     initialize charges; */
  31. /*     change reference voltages for charge computation */
  32.  
  33. /*<       qg=0.0d0 >*/
  34.     *qg = 0.;
  35. /*<       qb=0.0d0 >*/
  36.     *qb = 0.;
  37. /*<       vbd=vbs-vds >*/
  38.     vbd = *vbs - *vds;
  39. /*<       vgb=vgs-vbs >*/
  40.     vgb = *vgs - *vbs;
  41. /*<       vd=dmax1(phi-vbd,1.0d-8) >*/
  42. /* Computing MAX */
  43.     d_1 = *phi - vbd;
  44.     vd = max(1e-8,d_1);
  45. /*<       vs=dmax1(phi-vbs,1.0d-8) >*/
  46. /* Computing MAX */
  47.     d_1 = *phi - *vbs;
  48.     vs = max(1e-8,d_1);
  49. /*<       vg=vgb-vbin+phi >*/
  50.     vg = vgb - *vbin + *phi;
  51. /*<       vsp5=dsqrt(vs) >*/
  52.     vsp5 = sqrt(vs);
  53.  
  54. /*     determine operating region */
  55.  
  56. /*<       if (vgs.le.vth) go to 1100 >*/
  57.     if (*vgs <= *vth) {
  58.     goto L1100;
  59.     }
  60.  
  61. /*     compute charges for "on" region */
  62.  
  63. /*<  1020 vsat=vdsat+vs >*/
  64. /* L1020: */
  65.     vsat = *vdsat + vs;
  66. /*<       vs2=vs*vs >*/
  67.     vs2 = vs * vs;
  68. /*<       vs3=vs2*vs >*/
  69.     vs3 = vs2 * vs;
  70. /*<       vs5=vs3*vs2 >*/
  71.     vs5 = vs3 * vs2;
  72. /*<       vs1p5=vs*vsp5 >*/
  73.     vs1p5 = vs * vsp5;
  74. /*<       vs2p5=vs1p5*vs >*/
  75.     vs2p5 = vs1p5 * vs;
  76. /*<  1025 if (vd.ge.vsat) go to 1035 >*/
  77. /* L1025: */
  78.     if (vd >= vsat) {
  79.     goto L1035;
  80.     }
  81. /*<       ve=vd >*/
  82.     ve = vd;
  83. /*<  1030 dvedvd=1.0d0 >*/
  84. /* L1030: */
  85.     dvedvd = 1.;
  86. /*<       dvedvg=0.0d0 >*/
  87.     dvedvg = 0.;
  88. /*<       go to 1040 >*/
  89.     goto L1040;
  90. /*<  1035 ve=vsat >*/
  91. L1035:
  92.     ve = vsat;
  93. /*<       dvedvd=0.0d0 >*/
  94.     dvedvd = 0.;
  95. /*<       dvedvg=0.0d0 >*/
  96.     dvedvg = 0.;
  97. /*<  1040 ve2=ve*ve >*/
  98. L1040:
  99.     ve2 = ve * ve;
  100. /*<       ve3=ve2*ve >*/
  101.     ve3 = ve2 * ve;
  102. /*<       ve5=ve2*ve3 >*/
  103.     ve5 = ve2 * ve3;
  104. /*<       vep5=dsqrt(ve) >*/
  105.     vep5 = sqrt(ve);
  106. /*<       ve1p5=ve*vep5 >*/
  107.     ve1p5 = ve * vep5;
  108. /*<       ve2p5=ve1p5*ve >*/
  109.     ve2p5 = ve1p5 * ve;
  110. /*<       term0=ve+vs >*/
  111.     term0 = ve + vs;
  112. /*<       term1=vep5+vsp5 >*/
  113.     term1 = vep5 + vsp5;
  114. /*<       term2=vep5*vsp5 >*/
  115.     term2 = vep5 * vsp5;
  116. /*<       term3=ve2+vs2 >*/
  117.     term3 = ve2 + vs2;
  118. /*<       term4=ve*vs >*/
  119.     term4 = ve * vs;
  120. /*<       term5=term0*term1 >*/
  121.     term5 = term0 * term1;
  122. /*<       term6=(term3+term4)+term2*term0 >*/
  123.     term6 = term3 + term4 + term2 * term0;
  124. /*<       term7=(term3+term4)*term1 >*/
  125.     term7 = (term3 + term4) * term1;
  126. /*<       term10=vep5+0.5d0*vsp5 >*/
  127.     term10 = vep5 + vsp5 * .5;
  128. /*<       term11=1.5d0*ve+vsp5*term10 >*/
  129.     term11 = ve * 1.5 + vsp5 * term10;
  130. /*<       term12=2.0d0*ve1p5+vsp5*term11 >*/
  131.     term12 = ve1p5 * 2. + vsp5 * term11;
  132. /*<       term20=0.5d0*vep5+vsp5 >*/
  133.     term20 = vep5 * .5 + vsp5;
  134. /*<       term21=1.5d0*vs+vep5*term20 >*/
  135.     term21 = vs * 1.5 + vep5 * term20;
  136. /*<       term22=2.0d0*vs1p5+vep5*term21 >*/
  137.     term22 = vs1p5 * 2. + vep5 * term21;
  138. /*<       argn=0.5d0*vg*term5-0.4d0*gamasd*term6-term7/3.0d0 >*/
  139.     argn = vg * .5 * term5 - *gamasd * .4 * term6 - term7 / 3.;
  140. /*<       argd=vg*term1-gamasd*(term0+term2)/1.5d0-0.5d0*term1*term0 >*/
  141.     argd = vg * term1 - *gamasd * (term0 + term2) / 1.5 - term1 * .5 * term0;
  142. /*<       argd2=argd*argd >*/
  143.     argd2 = argd * argd;
  144. /*<       qg=cox*(vg-argn/argd) >*/
  145.     *qg = *cox * (vg - argn / argd);
  146. /*<       dgndve=0.5d0*vg*term11-0.4d0*gamasd*term12- >*/
  147. /*<      1   (2.5d0*ve2+vsp5*term12)/3.0d0 >*/
  148.     dgndve = vg * .5 * term11 - *gamasd * .4 * term12 - (ve2 * 2.5 + vsp5 * 
  149.         term12) / 3.;
  150. /*<       dddve=0.5d0*vg-gamasd*term10/1.5d0-0.5d0*term11 >*/
  151.     dddve = vg * .5 - *gamasd * term10 / 1.5 - term11 * .5;
  152. /*<       dqgdve=-cox/argd*(dgndve-(vg-qg/cox)*dddve) >*/
  153.     dqgdve = -(*cox) / argd * (dgndve - (vg - *qg / *cox) * dddve);
  154. /*<       dgndvs=0.5d0*vg*term21-0.4d0*gamasd*term22- >*/
  155. /*<      1   (2.5d0*vs2+vep5*term22)/3.0d0 >*/
  156.     dgndvs = vg * .5 * term21 - *gamasd * .4 * term22 - (vs2 * 2.5 + vep5 * 
  157.         term22) / 3.;
  158. /*<       dddvs=0.5d0*vg-gamasd*term20/1.5d0-0.5d0*term21 >*/
  159.     dddvs = vg * .5 - *gamasd * term20 / 1.5 - term21 * .5;
  160. /*<       cgdb=-cox/(argd*vep5)*(dgndve-(vg-qg/cox)*dddve)*dvedvd >*/
  161.     *cgdb = -(*cox) / (argd * vep5) * (dgndve - (vg - *qg / *cox) * dddve) * 
  162.         dvedvd;
  163. /*<       cgsb=-cox/(argd*vsp5)*(dgndvs-(vg-qg/cox)*dddvs) >*/
  164.     *cgsb = -(*cox) / (argd * vsp5) * (dgndvs - (vg - *qg / *cox) * dddvs);
  165. /*<       cggb=cox*(1.0d0-term1/argd*(0.5d0*term0-vg+qg/cox)) >*/
  166.     *cggb = *cox * (1. - term1 / argd * (term0 * .5 - vg + *qg / *cox));
  167. /*<       argn=vg*(term0+term2)/1.5d0-0.5d0*gamasd*term5-0.4d0*term6 >*/
  168.     argn = vg * (term0 + term2) / 1.5 - *gamasd * .5 * term5 - term6 * .4;
  169. /*<       dgndve=vg*term10/1.5d0-0.5d0*gamasd*term11-0.4d0*term12 >*/
  170.     dgndve = vg * term10 / 1.5 - *gamasd * .5 * term11 - term12 * .4;
  171. /*<       dgndvs=vg*term20/1.5d0-0.5d0*gamasd*term21-0.4d0*term22 >*/
  172.     dgndvs = vg * term20 / 1.5 - *gamasd * .5 * term21 - term22 * .4;
  173. /*<       qb=-gamasd*cox*argn/argd >*/
  174.     *qb = -(*gamasd) * *cox * argn / argd;
  175. /*<       cbdb=-cox/(vep5*argd)*(qb/cox*dddve+gamasd*dgndve)*dvedvd >*/
  176.     *cbdb = -(*cox) / (vep5 * argd) * (*qb / *cox * dddve + *gamasd * dgndve) 
  177.         * dvedvd;
  178. /*<       cbsb=-cox/(vsp5*argd)*(qb/cox*dddvs+gamasd*dgndvs) >*/
  179.     *cbsb = -(*cox) / (vsp5 * argd) * (*qb / *cox * dddvs + *gamasd * dgndvs);
  180.  
  181. /*<       cbgb=-cox/argd*(gamasd*(term0+term2)/1.5d0+qb/cox*term1) >*/
  182.     *cbgb = -(*cox) / argd * (*gamasd * (term0 + term2) / 1.5 + *qb / *cox * 
  183.         term1);
  184. /*<       go to 2000 >*/
  185.     goto L2000;
  186.  
  187. /*  finish special cases */
  188.  
  189. /*<  1100 if (vg.gt.0.0d0) go to 1110 >*/
  190. L1100:
  191.     if (vg > 0.) {
  192.     goto L1110;
  193.     }
  194. /*<       qg=cox*vg >*/
  195.     *qg = *cox * vg;
  196. /*<       cggb=cox >*/
  197.     *cggb = *cox;
  198. /*<       go to 1120 >*/
  199.     goto L1120;
  200. /*<  1110 gamma2=gamasd*0.5d0 >*/
  201. L1110:
  202.     gamma2 = *gamasd * .5;
  203. /*<       sqarg=dsqrt(gamma2*gamma2+vg) >*/
  204.     sqarg = sqrt(gamma2 * gamma2 + vg);
  205. /*<       qg=gamasd*cox*(sqarg-gamma2) >*/
  206.     *qg = *gamasd * *cox * (sqarg - gamma2);
  207. /*<       cggb=0.5d0*cox*gamasd/sqarg >*/
  208.     *cggb = *cox * .5 * *gamasd / sqarg;
  209. /*<  1120 qb=-qg >*/
  210. L1120:
  211.     *qb = -(*qg);
  212. /*<       cbgb=-cggb >*/
  213.     *cbgb = -(*cggb);
  214. /*<       cgdb=0.0d0 >*/
  215.     *cgdb = 0.;
  216. /*<       cgsb=0.0d0 >*/
  217.     *cgsb = 0.;
  218. /*<       cbdb=0.0d0 >*/
  219.     *cbdb = 0.;
  220. /*<       cbsb=0.0d0 >*/
  221.     *cbsb = 0.;
  222.  
  223. /*  finished */
  224.  
  225. /*<  2000 qc=-(qg+qb) >*/
  226. L2000:
  227.     *qc = -(*qg + *qb);
  228. /*<  2050 return >*/
  229. /* L2050: */
  230.     return 0;
  231. /*<       end >*/
  232. } /* mosq2_ */
  233.  
  234.